2017-03-08 67 views
-1

爲我的OSX和iOS庫。Objective-C - 是否有可能在我的結構中有NSArray?

我試圖在我的struct中保留array。但不幸的是NSArray *array_url;裏面的struct不允許Xcode。

但是,當我刪除__unsafe_unretained NSArray *array_url並把它放在主塊,然後其確定(但這不是我的目標),是不可能把數組放在結構?

#import <Foundation/Foundation.h> 

struct OSX { 
    __unsafe_unretained NSString *input_url; 
    __unsafe_unretained NSString *use_url;  
    __unsafe_unretained NSArray *array_url; //USE it later in other place 

}; 

int main(int argc, const char * argv[]) { 
    @autoreleasepool {  
    struct OSX struct_OSX; 
    struct_OSX.input_url = @"test1:test2:test3:..:..:99:9900"; 

    NSArray *struct_OSX.array_url = [struct_OSX.input_url componentsSeparatedByString:@":"]; 
    NSLog(@"%@", struct_OSX.array_url); 

    for(NSArray *subArray in struct_OSX.array_url) { 
     NSLog(@"%@", subArray);  
    } 

    NSLog(@"%@", [struct_OSX.array_url objectAtIndex:1]);    
    // let me validate the array: if ([struct_OSX.array_url length] == 0) { } 

    } 

    return 0; 

} 
+0

大概的此重複:http://stackoverflow.com/questions/2488877/using-c-structs-which-contains-objc-objects基本上爲C包含Objective-C對象的結構是一個非常糟糕的想法(tm)(pat。pend。)。 – matt

+1

'NSArray * struct_OSX.array_url = ...'根本沒有意義。如果我糾正它,我不會得到任何診斷信息。什麼是錯誤信息,以及你在哪個位置得到它?順便說一句:代碼只能工作,因爲數組是用方便的分配器構造的,而且ARP沒有關閉。這對你來說很清楚嗎? –

+0

工作我已經發布它作爲答案。 – YumYumYum

回答

-2

struct與NSArray的

#import <Foundation/Foundation.h> 

struct iOS { 
    __unsafe_unretained NSString *input_url; 
    __unsafe_unretained NSString *use_url; 
    __unsafe_unretained NSString *server; 
    __unsafe_unretained NSString *agent; 
    __unsafe_unretained NSString *roomid; 
    __unsafe_unretained NSArray *array_url; 
    __unsafe_unretained NSArray *array_url_modified; 
}; 

int main(int argc, const char * argv[]) { 
    @autoreleasepool { 
    struct iOS StructIOS; 
    StructIOS.input_url = @"https://a/b/c"; 

    //NSArray *work_array = [StructIOS.input_url componentsSeparatedByString:@"https://"]; 
    StructIOS.array_url = [StructIOS.input_url componentsSeparatedByString:@"https://"]; 
    NSLog(@"%@", StructIOS.array_url); 

    for(NSArray *subArray in StructIOS.array_url) { 
     NSLog(@"%@", subArray); 
    } 

    NSLog(@"%@", [StructIOS.array_url objectAtIndex:1]); 
    StructIOS.use_url =[StructIOS.array_url objectAtIndex:1] ; 

    if ([StructIOS.use_url length] > 0) { 
     StructIOS.array_url_modified = [StructIOS.input_url componentsSeparatedByString:@"/"]; 
     StructIOS.server = [StructIOS.array_url_modified objectAtIndex:0]; 
     StructIOS.agent = [StructIOS.array_url_modified objectAtIndex:1]; 
     StructIOS.roomid = [StructIOS.array_url_modified objectAtIndex:2]; 

     NSLog(@"OK %@ %@ %@" , 
      StructIOS.server, 
      StructIOS.agent, 
      StructIOS.roomid); 
    } 
    else { 
     NSLog(@"NOK"); 
    } 
    } 

    return 0; 
} 
+3

爲什麼不直接聲明一個NSObject子類一組'@ property'聲明?它可以和ARC一起工作,當你需要添加一些附加在結構上的功能時,重構會容易得多。...... – bbum

+3

不要在Objective-C中使用'struct's來存放NSObjects。它不起作用。運行時不會對它們進行內存管理,這意味着對象可能會在您最不期待的時候被釋放。停止,不要這樣做。 –