小编fuz*_*oat的帖子

unnamed enum&typedef?

我对typedef/enum感到有点困惑,直到我意识到我不需要命名emun.当与typedef一起使用时,这两者之间是否有任何差异/好处,对我来说第二个似乎更容易理解.

第一个例子:

typedef enum enumMenuItems {
    none,
    add,
    save,
    load,
    list,
    remove
} menuItems;

menuItems optionSelect = none;
Run Code Online (Sandbox Code Playgroud)

第二个例子:

typedef enum {
    Earth = 1, 
    Mars,
    Saturn,
    Neptune,
    Jupiter
} planets;

planets closest = Mars;
Run Code Online (Sandbox Code Playgroud)

.

编辑:

typedef enum enumMenuItems {
    none,
    add,
    save,
    load,
    list,
    remove
} menuItems;
Run Code Online (Sandbox Code Playgroud)

所以上面主要定义了两种类型,一种是enumMenuItems枚举,另一种是enumMenuItems的typedef,叫做menuItems.

menuItems optionSelect = save;
enum enumMenuItems optionSelect = save;
Run Code Online (Sandbox Code Playgroud)

上面两个声明基本相同,一个使用typedef,另一个使用enum.因此,如果您使用typedef,则可以保留未命名的枚举,因为可以通过typedef menuItem访问该类型.

加里

objective-c

3
推荐指数
1
解决办法
1560
查看次数

mutableCopyWithZone,复制NSMutableArray?

我试图制作一个包含5个实例变量的行星对象的mutableCopy(其中一个是字符串文字的NSMutableArray.我的问题是我不确定如何将newPlanet>数据设置为self> data的副本,是有道理?

-(id) mutableCopyWithZone: (NSZone *) zone {
    Planet *newPlanet = [[Planet allocWithZone:zone] init];
    NSLog(@"_mutableCopy: %@", [newPlanet self]);
    [newPlanet setName:name];
    [newPlanet setType:type];
    [newPlanet setMass:mass];
    [newPlanet setIndex:index];

    // NSMutableArray *data; HOW TO: newPlanet>data = self>data? 

    return(newPlanet);
}
Run Code Online (Sandbox Code Playgroud)

EDIT_001:

基于Chuck&bbum的评论,我更新了我的方法,并添加了以下内容......

@property(retain) NSMutableArray *data;
@synthesize data;
Run Code Online (Sandbox Code Playgroud)

.

-(id) mutableCopyWithZone: (NSZone *) zone {
    Planet *newPlanet = [[Planet allocWithZone:zone] init];
    NSLog(@"_mutableCopy: %@", [newPlanet self]);
    [newPlanet setName:name];
    [newPlanet setType:type];
    [newPlanet setMass:mass];
    [newPlanet setIndex:index];

    NSMutableArray *copiedArray = [[self data] mutableCopyWithZone:zone];
    [newPlanet setData: copiedArray];
    [copiedArray release];

    return(newPlanet); …
Run Code Online (Sandbox Code Playgroud)

objective-c

3
推荐指数
1
解决办法
2154
查看次数

执行清理代码?

一般来说goto很糟糕(我们都知道为什么)在不必复制代码的情况下,对错误实现简单清理(如下例所示)的更好方法.在我看来,下面的代码很好,我只是好奇别人会做什么:

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]
    int returnCode = 0;

    // ... Other code

    // WRITE: To file
    if([dataStore writeToFile:savePathData atomically:YES] == NO) {
        NSLog(@"writeToFile ... Error");
        returnCode = 1;
        goto cleanUpCode;
    }

    // ... Other code

    // Clean up
    cleanUpCode:
    [archiver release];
    [newPlanet release];
    [pool drain];
    return(returnCode);
}
Run Code Online (Sandbox Code Playgroud)

EDIT_001:

总的来说,我同意@try,@ catch,@ finally不仅仅是肯定的方式,但我确实有两个小问题.

(1)三个@try,@ catch,@ finally块必须全部在一起,你没有灵活性在@catch和@finally之间放置你可能想要绕过的代码.

(2)Apple的Obj-C 2.0文档声明如下:"重要:在Objective-C中,异常是资源密集型的.您不应该使用异常来进行一般的流量控制,或者只是表示错误(例如文件不是无障碍)".

很多人

加里

objective-c

3
推荐指数
1
解决办法
509
查看次数

在开始时宣布,或在你去的时候宣布?

我会说这几乎是一个样式/可读性的东西,虽然我确实看到几乎所有的objective-c/cocoa按照"METHOD_002"格式化.我只是好奇如果"METHOD_001"被认为是坏的风格,将所有声明放在方法的顶部是有好处的,但是如果你没有声明使用它们的对象,那么在可读性方面又有缺点吗?

METHOD_001

-(IBAction)dateButtonPressed {

    NSDate      *dateSelected;
    NSString    *dateString;
    NSArray     *dateItems;
    NSString    *alertMessage;
    UIAlertView *alert;

    dateSelected = [datePicker date];
    dateString = [[NSString alloc] initWithFormat:@"%@", dateSelected];
    dateItems = [dateString componentsSeparatedByString:@" "];
    alertMessage = [[NSString alloc] initWithFormat:@"Date: %@ Time: %@",  [dateItems objectAtIndex:0], [dateItems objectAtIndex:1]];
    alert = [[UIAlertView alloc] initWithTitle:@"You Selected" 
                                       message:alertMessage 
                                      delegate:nil 
                             cancelButtonTitle:@"OK" 
                             otherButtonTitles:nil];
    [alert show];
    [alert release];
    [alertMessage release];
    [dateString release];

}
Run Code Online (Sandbox Code Playgroud)

METHOD_002

-(IBAction)dateButtonPressed {

    NSDate *dateSelected = [datePicker date];
    NSString *dateString = [[NSString alloc] initWithFormat:@"%@", dateSelected];
    NSArray *dateItems = [dateString componentsSeparatedByString:@" …
Run Code Online (Sandbox Code Playgroud)

cocoa-touch objective-c

3
推荐指数
1
解决办法
195
查看次数

是否在viewDidUnload之后调用dealloc?

一个快速的问题,在viewDidUnload之后还会调用dealloc吗?关于pickerData的问题,我的理解是在调用dealloc时会释放变量.我的理由是我在一本书中注意到作者在viewDidUnload中将pickerData设置为nil.这是无害的矫枉过正,甚至可能是好的做法,还是没有一种情况下没有另一种就不会被召唤.

接口:

@interface SingleViewController : UIViewController {
    NSArray *pickerData;
}
@property(nonatomic, retain) NSArray *pickerData;
@end
Run Code Online (Sandbox Code Playgroud)

IMPLMENTATION:

-(void)viewDidUnload {
    [self setSinglePicker:nil];
    [self setPickerData:nil]; 
    [super viewDidUnload];
}

-(void)dealloc {
    NSLog(@"Here");
    [singlePicker release];
    [pickerData release];
    [super dealloc];
}
@end
Run Code Online (Sandbox Code Playgroud)

加里

cocoa-touch objective-c

3
推荐指数
1
解决办法
881
查看次数

NSNumber计算和精度?

如果可能的话,有两个快速的问题,这就是我应该如何处理两个NSNumber对象,进行计算并最终得到一个同样是NSNumber的结果?

NSNumber *flux = [[NSNumber alloc] initWithDouble:100.0];
NSNumber *mass = [[NSNumber alloc] initWithDouble:3];

double intermediate = [flux doubleValue] / [mass doubleValue];
NSLog(@"INTER : %.20f", intermediate);

NSNumber *result = [[NSNumber alloc] initWithDouble:intermediate];
NSLog(@"RESULT: %@", result);

...
...

[flux release];
[mass release];
[result release];
Run Code Online (Sandbox Code Playgroud)

另外从NSLog查看控制台的结果,是否有任何精度损失?我会假设没有,我看到的只是显示精度,但只是好奇吗?

INTER : 33.33333333333333570181
RESULT: 33.33333333333334
Run Code Online (Sandbox Code Playgroud)

加里

cocoa objective-c

3
推荐指数
1
解决办法
8815
查看次数

使用NSXMLParserDelegate构建项目时出错

TurbineXMLParser.h

#import <Foundation/Foundation.h>

@interface TurbineXMLParser : NSObject <NSXMLParserDelegate> {
...
Run Code Online (Sandbox Code Playgroud)

TurbineXMLParser.m

#import "TurbineXMLParser.h"
Run Code Online (Sandbox Code Playgroud)

我刚刚在当前项目中添加了一个新类,我之前在单个文件中进行了测试.当我尝试构建项目时,我收到错误:错误:找不到'NSXMLParserDelegate'的协议声明

我做了一些搜索并尝试添加以下内容......

TurbineXMLParser.h

#import <Foundation/Foundation.h>

@protocol NSXMLParserDelegate;

@interface TurbineXMLParser : NSObject <NSXMLParserDelegate> {
...
Run Code Online (Sandbox Code Playgroud)

但仍然收到警告:警告:未找到协议'NSXMLParserDelegate'的定义

任何帮助将非常感激

.
.
.
Run Code Online (Sandbox Code Playgroud)

EDIT_002:

<NSXMLParserDelegate>从@interface 删除确实有效,但我很好奇为什么,我混淆和混乱?我的印象是委托对象必须采用NSXMLParserDelegate协议,即<NSXMLParserDelegate>在超类之后添加.

我有两个实例,其工作方式不同,第一个是单个命令行文件中的项目,如果我不添加,<NSXMLParserDelegate>则警告:

class 'TestXMLParser' does not implement the 'NSXMLParserDelegate' protocol
Run Code Online (Sandbox Code Playgroud)

第二个实例是我在设置多个*.h和*.m文件(其中一个类是MyXMLParser.h,MyXMLParser.m)时,我尝试构建项目时<NSXMLParserDelegate>遇到此错误:

error: cannot find protocol declaration for 'NSXMLParserDelegate'
Run Code Online (Sandbox Code Playgroud)

删除<NSXMLParserDelegate>,一切正常,没有错误,没有警告......

加里

iphone cocoa-touch objective-c

3
推荐指数
2
解决办法
1万
查看次数

检查NSMutableArray中的重复对象?

我正在向NSMutableArray添加对象(在本例中为NSNumbers),我想检查在添加之前检查数组中重复项的最佳方法.(即)

Number to add
if (NSMutableArray does not contain Number) {
    add Number
}
Run Code Online (Sandbox Code Playgroud)

编辑:

非常感谢,我今天早上在NSArray运气好,但完全错过了"containsObject".那本来可以做得很好,但看过NSMutableSet远远超过我想要的东西.最后一个问题,如果我可以:

while([mySet count] < 5) {
    NSNumber *numberToAdd = [NSNumber numberWithInt:random() %10];
    [mySet addObject:numberToAdd];
}
Run Code Online (Sandbox Code Playgroud)

我不认为这实际上很重要,但最好检查一下"containsObject"是否只是扔掉副本并继续进行.

while([mySet count] < 5) {
    NSNumber *numberToAdd = [NSNumber numberWithInt:random() %10];
    if(!mySet containsObject:numberToAdd) [mySet addObject:numberToAdd];
}
Run Code Online (Sandbox Code Playgroud)

再次非常感谢,这真的很酷,并将节省我一大堆时间.

加里

cocoa objective-c

3
推荐指数
2
解决办法
1万
查看次数

排序NSArray并返回NSArray?

我只是想把数字顺序排序NSArray,NSNumbers但我不太确定最好的方法.根据我的想法001和002是相当可比的,所以我怀疑要么会这样做.对于003我不确定NSMutableArray当方法预期NSArray是否良好实践时返回,它可以工作,但感觉很尴尬.

-(NSArray *)testMethod:(NSArray *)arrayNumbers {    
    // 001
    NSMutableArray *sortedArray = [NSMutableArray arrayWithArray:arrayNumbers];
    [sortedArray sortUsingSelector:@selector(compare:)];
    arrayNumbers = [NSArray arrayWithArray:sortedArray];
    return(arrayNumbers);   
}
Run Code Online (Sandbox Code Playgroud)

.

-(NSArray *)testMethod:(NSArray *)arrayNumbers {    
    // 002
    NSMutableArray *sortedArray = [NSMutableArray arrayWithArray:arrayNumbers];
    [sortedArray sortUsingSelector:@selector(compare:)];
    arrayNumbers = [[sortedArray copy] autorelease];
    return(arrayNumbers);   
}
Run Code Online (Sandbox Code Playgroud)

.

-(NSArray *)testMethod:(NSArray *)arrayNumbers {    
    // 003
    NSMutableArray *sortedArray = [NSMutableArray arrayWithArray:arrayNumbers];
    [sortedArray sortUsingSelector:@selector(compare:)];
    return(sortedArray);    
}
Run Code Online (Sandbox Code Playgroud)

iphone cocoa-touch objective-c

3
推荐指数
2
解决办法
1424
查看次数

Xcode,打印所有文件?

Xcode中是否有一种方法可以一次性打印所有“类”源文件,而无需一一遍历?

加里

xcode

3
推荐指数
1
解决办法
2052
查看次数

标签 统计

objective-c ×9

cocoa-touch ×4

cocoa ×2

iphone ×2

xcode ×1