相关疑难解决方法(0)

什么更好:编写函数或编写方法?什么成本更高?

目前我正在为我的第一个Objective-c API做出一些决定.没什么大不了的,只是帮助我自己将来更快地完成任务.

在阅读了几个小时关于不同模式,比如制作类别,单身等等之后,我遇到了一些我喜欢的东西,因为它对我来说似乎很容易维护.我正在制作一套有用的功能,这些功能在任何地方都很有用.

所以我做的是:

1)我创建了两个新文件(.h,.m),并为"class"命名:SLUtilsMath,SLUtilsGraphics,SLUtilsSound等.我认为这是一种"命名空间",所以所有这些东西总是被称为SLUtils******.我将它们全部添加到Group SL中,其中包含一个子组SLUtils.

2)然后我只将函数签名放在.h文件中,并在.m文件中实现函数.猜猜看:它有效!! 我很高兴它,它很容易使用.关于它的唯一令人讨厌的事情是,我每次需要时都必须包含适当的标题.但那没关系,因为那是正常的.不过,我可以将它包含在头文件前缀pch文件中.

然后,我去了厕所,一个幽灵出现在那里,说:"嘿!制作真正的方法而不是函数是不是更好?你不应该制作类方法,所以你必须调用一个方法而不是而不是一个功能?是不是更酷,是不是有更好的表现?" 好吧,为了便于阅读,我更喜欢这些功能.另一方面,他们没有像方法那样的"命名参数",afaik.

那么在那种情况下你更喜欢什么?

当然我不想在使用有用的方法或函数之前分配对象.那将是痛苦的.

也许厕所鬼是对的.有一个更酷的方式.嗯,对我个人而言,这很棒:

MYNAMESPACECoolMath.h

#import <Foundation/Foundation.h>


@interface MYNAMESPACECoolMath : NSObject {
}

+ (float)randomizeValue:(float)value byPercent:(float)percent;

+ (float)calculateHorizontalGravity:(CGPoint)p1 andPoint:(CGPoint)p2;

// and some more
@end
Run Code Online (Sandbox Code Playgroud)

然后在代码中,我只需导入MYNAMESPACECoolMath.h并调用:

CGFloat myValue = [MYNAMESPACECoolMath randomizeValue:10.0f byPercent:5.0f];

没有讨厌的实例化,初始化,分配,什么永远.对我来说,这个模式在java中看起来像一个静态方法,非常好用且易于使用.

据我所知,功能优于代码的可读性更高.在查看CGRectMake(10.0f,42.5f,44.2f,99.11f)时,您可能需要查看这些参数的含义,如果您对它不熟悉的话.但是当您使用"命名"参数进行方法调用时,您会立即看到参数是什么.

我认为,当谈到可以在任何地方使用的简单有用的方法/功能时,我错过了对单例类产生重大影响的观点.制作特殊类型的随机值不属于任何东西,它是全局的.像草一样.像树一样.像空气一样.每个人都需要它.

iphone cocoa-touch uikit

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

在iphone中全局访问整数和字符串?

我想访问一个整数和一个字符串从一个类到所有其他类?最好的方法是什么?我想在程序中的任何位置增加值,然后想要在声明的类中更新它们....

任何想法如何实现这一点???

iphone xcode objective-c

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

如何在ARC下将目标c对象的地址转换为void*volatile*?

我有一个简单的客观c对象

NSManagedObjectContext * moc = nil

现在我需要将它传递给接受类型参数的ARC环境中的函数

void *volatile * value

我试过了

&((__bridge void *)moc))

但是我得到以下编译器错误

Address expression must be lvalue or a function pointer

我也试过了

void ** addr = (__bridge void **)(&moc);
Run Code Online (Sandbox Code Playgroud)

但是我得到了错误

Incompatible types casting 'NSManagedObjectContext * __strong *' to 'void **' with a __bridge cast

有没有办法先进行转换然后获取转换指针的地址?

编辑

更具体地说,我正在尝试实现另一个stackoverflow问题中描述的单例模式,但是我无法NSManagedObjectContext在ARC环境中将目标c 对象的地址输入到以下函数的第三个参数中.

OSAtomicCompareAndSwapPtrBarrier(void *__oldValue, void *__newValue, void *volatile *__theValue)

cocoa pointers casting objective-c automatic-ref-counting

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

Objective-C Singletons和LLVM/clang泄漏警告

我在应用程序的几个地方使用单例模式,并且clang在分析代码时出现内存泄漏错误.

static MyClass *_sharedMyClass;
+ (MyClass *)sharedMyClass {
  @synchronized(self) {
    if (_sharedMyClass == nil)
      [[self alloc] init];
  }
  return _sharedMyClass;
}

// clang error: Object allocated on line 5 is no longer referenced after this point and has a retain count of +1 (object leaked)
Run Code Online (Sandbox Code Playgroud)

我正在使用这些设置scan-build:

scan-build -v -v -v -V -k xcodebuild

我非常肯定单例中的代码很好 - 毕竟,它与Stack Overflow以及Apple的文档中引用的代码相同 - 但我希望将内存泄漏警告整理出来以便我的扫描 - 建立回报成功.

objective-c llvm clang

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

仅初始化一次类

我有一个类,其中包含一些需要从另一个类调用的实例方法.我知道怎么做 -

TimeFormatter *myTimeFormatter = [[TimeFormatter alloc] init];
[myTimeFormatter formatTime:time];
Run Code Online (Sandbox Code Playgroud)

但是,每次我需要调用其中一个方法时,我不希望必须分配和初始化TimeFormatter.(我需要从另一个类中的各种方法调用TimeFormatter的方法).

我尝试过

TimeFormatter *myTimeFormatter = [[TimeFormatter alloc] init];
Run Code Online (Sandbox Code Playgroud)

"本身",或者不在任何块中,但是当我编译时,我得到一个"初始化元素不是常量"错误.

任何输入都非常感谢!

iphone macos cocoa objective-c

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

将managedObjectContext传递给视图/控制器层次结构

在应用程序委托中创建的大多数情况下的托管对象上下文.将它传递给视图/控制器层次结构的方法有哪些,因此树中的每个导航/选项卡控制器都可以访问它.每次从父母到孩子的传递都可能不是最好的,因为我每次都必须携带这些信息,有时不是所有的控制器都可能需要它.

iphone core-data software-design

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

找不到实体的NSManagedObjectModel

这是viewDidLoad中fetchRequest的代码,代码遵循这里的教程,只是我以编程方式链接导航控制器和tableview,而不是使用界面构建器.实体ProductInfo存在.但是,当我运行程序时,我收到错误:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+entityForName: could not locate an NSManagedObjectModel for entity name 'ProductInfo''
Run Code Online (Sandbox Code Playgroud)

我已经重置模拟器,因为它是一个旧模型,但错误仍然发生.我也切换到使用FetchedResultsController,但问题仍然存在.问题是因为这些fetchedResultsController方法不在appdelegate中?它们目前位于TableViewController中.我怎么解决这个问题?

viewDidLoad方法:

- (void)viewDidLoad{

NSFetchRequest * fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription * entity = [NSEntityDescription entityForName:@"ProductInfo" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSError * error;
self.productInfos = [_context executeFetchRequest:fetchRequest error:&error];
[fetchRequest release];
[super viewDidLoad];}
Run Code Online (Sandbox Code Playgroud)

ProductInfo.h:

@class ProductDetails;

@interface ProductInfo : NSManagedObject {
@private
}
@property (nonatomic, retain) NSString * productName;
@property (nonatomic, retain) NSString * productPrice;
@property (nonatomic, retain) …
Run Code Online (Sandbox Code Playgroud)

core-data objective-c nsmanagedobject ios

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

我是怎么意味着释放从类方法返回的数组?

我有一段代码调用方法返回NSMutableArray如下:

+(NSMutableArray *)method {

NSMutableArray *rgb = [[NSMutableArray alloc] initWithObjects:....., nil];

    return rgb;

}
Run Code Online (Sandbox Code Playgroud)

它每次被叫时都会泄漏.放下[rgb release];return似乎不起作用.放在它之前return使我的应用程序崩溃.同时加入autorelease使我的应用程序崩溃.建议?

cocoa-touch memory-leaks memory-management objective-c ios

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

Objective-C:静态字段和实现单例模式

美好的一天,朋友们.

从新手回来关于Obj-C的愚蠢问题:)

我正在尝试在Obj-C中实现单例设计模式:

@interface SampleSingleton : NSObject {
@private
    static SampleSingleton* instance;
}
+(SampleSingleton*) getInstance;
Run Code Online (Sandbox Code Playgroud)

编译器返回错误:"在'静态'之前的预期说明符 - 限定符列表".

singleton constants objective-c

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

Objective-C Singleton实现,我做得对吗?

在我的班级甲板我有

static Deck *gInstance = NULL;


+(Deck *) instance {
    @synchronized(self) {
        if (gInstance == NULL)
            gInstance = [[self alloc] init];
    }

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

和一个看起来像的init方法

-(id) init {

    if (gInstance != NULL) {
        return self;
    }

    self = [super init];

    if (self) {
       // Lots of clever things
    }
    gInstance = self;
    return self;

}
Run Code Online (Sandbox Code Playgroud)

我在这里关心的主要是是否init正确实施.如果我写的内容适合你,请告诉我.

或者...有没有办法让我init私密并阻止人们(包括我自己)完全看到它?

singleton objective-c

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